package com.icbc.open.chengdu.demo.utils;

import com.csii.pp.icbc.util.SM2Utils;
import com.csii.pp.icbc.util.SM4Utils;
import com.csii.pp.icbc.util.Util;
import com.icbc.open.chengdu.demo.BaseData;

import java.io.IOException;

/**
 * 密钥工具类
 *
 * @author xcz
 */
public class SecretUtils {

    /**
     * 解密工行返回的加密的银行卡号
     *
     * @param secretMediumId 加密的银行卡号
     * @param secretSM4Key   加密的sm4密钥
     * @return 解密的银行卡号
     */
    public static String decryptMediumId(String secretMediumId, String secretSM4Key) {
        String result = "解密失败";
        try {
            //使用SM2的私钥对加密的SM4密钥进行解密，再转为16进制
            String sm4Key = Util.getHexString(SM2Utils.decryptBase64(Util.hexToByte(BaseData.MY_SM2_PRIVATE_KEY), secretSM4Key));
            //初始化SM4解密工具类
            SM4Utils.secretKey = sm4Key;
            SM4Utils.hexString = true;
            SM4Utils.iv = "00000000000000000000000000000000";
            //SM4 解密
            result = SM4Utils.decryptData_CBC(secretMediumId);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * SM4 加密数据
     *
     * @param sm4Key sm4密钥
     * @param data   原始数据
     * @return 加密后的数据
     */
    public static String encryptSM4(String sm4Key, String data) {
        //构造SM4加密工具
        SM4Utils.secretKey = Util.getHexString(sm4Key.getBytes());
        SM4Utils.hexString = true;
        SM4Utils.iv = "00000000000000000000000000000000";
        return SM4Utils.encryptData_CBC(data);
    }

    /**
     * SM2 加密数据
     *
     * @param data 原始数据
     * @return 加密后的数据
     * @throws Exception
     */
    public static String encryptSM2(String data) throws Exception {
        byte[] hexPublicKey = Util.hexToByte(BaseData.ICBC_SM2_PUBLIC_KEY);
        System.out.println(BaseData.ICBC_SM2_PUBLIC_KEY);
        System.out.println(new String(hexPublicKey));
        return SM2Utils.encrypt(hexPublicKey, data.getBytes());
    }


}
